package main

import (
	"flag"
	"log"
	"path/filepath"
	"strings"

	"excel-exporter/config"
	"excel-exporter/exporter"
	"excel-exporter/types"
)

func main() {
	// 定义命令行参数
	var configPath string
	var excelPaths string
	
	flag.StringVar(&configPath, "config", "config.json", "配置文件路径")
	flag.StringVar(&excelPaths, "excel", "", "指定导出的Excel文件路径，多个文件用逗号分隔，为空则导出所有")
	flag.Parse()

	// 初始化处理器
	config.InitProcessors()

	// 加载配置文件
	appConfig, err := config.LoadConfig(configPath)
	if err != nil {
		log.Fatal("加载配置文件失败:", err)
	}

	// 如果指定了Excel文件，过滤导出项
	if excelPaths != "" {
		specifiedExcels := strings.Split(excelPaths, ",")
		filteredExports := filterExports(appConfig, specifiedExcels)
		appConfig.Exports = filteredExports
		
		if len(filteredExports) == 0 {
			log.Printf("Error: 没有找到指定的Excel文件: %s", excelPaths)
			return
		}
		
		log.Printf("将导出指定的 %d 个Excel文件", len(filteredExports))
	}

	// 执行导出
	if err := exporter.ExportAll(appConfig); err != nil {
		log.Fatal("导出失败:", err)
	}

	log.Println("导出成功!")
}

// filterExports 根据指定的Excel文件路径过滤导出项
func filterExports(appConfig *types.Config, specifiedExcels []string) []types.ExportConfig {
	var filtered []types.ExportConfig
	
	for _, export := range appConfig.Exports {
		for _, specified := range specifiedExcels {
			// 清理路径，确保比较的一致性
			exportPath := cleanPath(export.ExcelPath)
			specifiedPath := cleanPath(specified)
			
			// 检查是否匹配（支持完整路径或文件名匹配）
			if exportPath == specifiedPath || filepath.Base(exportPath) == filepath.Base(specifiedPath) {
				filtered = append(filtered, export)
				break
			}
		}
	}
	
	return filtered
}

// cleanPath 清理路径，转换为绝对路径并标准化
func cleanPath(path string) string {
	// 如果是相对路径，转换为绝对路径
	if !filepath.IsAbs(path) {
		absPath, err := filepath.Abs(path)
		if err == nil {
			path = absPath
		}
	}
	
	// 清理路径（去除多余的./和../）
	return filepath.Clean(path)
}